package org.feifei.org.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.feifei.basic.query.BaseQuery;
import org.feifei.basic.util.CommonResult;
import org.feifei.basic.util.PageList;
import org.feifei.org.domain.SystemDictionaryDetail;
import org.feifei.org.domain.SystemDictionaryType;
import org.feifei.org.query.SystemDictionaryTypeQuery;
import org.feifei.org.service.SystemDictionaryDetailService;
import org.feifei.org.service.SystemDictionaryTypeService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author forever
 * @Description: SystemDictionaryTypeQuery接口
 *               数据字典类型的接口
 * @date 2021/12/04 09:12
 */
@RestController
@RequestMapping("/dictionaryType")
@Api(tags = "SystemDictionaryTypeController", description = "数据字典类型接口")
public class SystemDictionaryTypeController {

    @Resource
    private SystemDictionaryTypeService systemDictionaryTypeService;

    @Resource
    private SystemDictionaryDetailService systemDictionaryDetailService;

    /**
     * 通过条件查询获取所有数据
     * @param query 高级查询条件 包括分页、关键词搜索
     * @return 所有数据字典类型
     */
    @PostMapping("/list")
    @ApiOperation(value = "数据字典条件查询")
    public PageList<List<SystemDictionaryType>> getAllByPage(@RequestBody SystemDictionaryTypeQuery query) {
        return systemDictionaryTypeService.listByPage(query);
    }

    /**
     * 添加或者修改的方法
     * @param systemDictionaryType 数据字典类型
     * @return 前台获取成功或者失败的结果
     */
    @PostMapping
    @ApiOperation("添加或者修改的方法， 根据id来判断获取")
    public CommonResult<SystemDictionaryType> addOrSave(@RequestBody SystemDictionaryType systemDictionaryType) {
        try {
            systemDictionaryTypeService.save(systemDictionaryType);
            return CommonResult.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }

    /**
     * 根据id获取
     * @param id 数据字典分类的id
     * @return 具体的数据字典
     */
    @GetMapping("/{id}")
    @ApiOperation("获取到指定id的数据字典")
    public CommonResult<SystemDictionaryType> get(@PathVariable("id")Long id) {
        try {
            return CommonResult.ok(systemDictionaryTypeService.get(id));
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }

    /**
     * 根据指定的id 来删除数据字类型，需要先删除该数据字典类型对应的明细
     * @param id
     * @return 前台获取成功或者失败的结果
     */
    @DeleteMapping("/{id}")
    @ApiOperation("根据指定的id来删除某一条数据")
    public CommonResult<SystemDictionaryType> delete(@PathVariable("id")Long id) {
        try {
            systemDictionaryTypeService.remove(id);
            return CommonResult.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }

    /**
     * 批量删除，需要先删除对应的明细表，再删除自身
     * @param ids 传入需要批量删除的集合
     * @return  前台获取成功或者失败的结果
     */
    @PatchMapping
    @ApiOperation("根据id的集合批量删除")
    public CommonResult<SystemDictionaryType> batchRemove(@RequestBody List<Long> ids) {
        try {
            systemDictionaryTypeService.batchRemove(ids);
            return CommonResult.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }

    /**
     * 获取所有的数据类型，不带任何条件
     * @return
     */
    @GetMapping("/detail/{id}")
    @ApiOperation("不带条件获取所有")
    public CommonResult<List<SystemDictionaryType>> getAllNoDiction(@PathVariable("id")Long id) {
        try {
            return CommonResult.ok(systemDictionaryDetailService.getByTypeId(id));
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }

    /**
     * 获取所有的数据类型，不带任何条件
     * @return
     */
    @GetMapping("/all")
    @ApiOperation("不带条件获取所有")
    public CommonResult<List<SystemDictionaryType>> getAllNoDiction() {
        try {
            return CommonResult.ok(systemDictionaryTypeService.list());
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failure();
        }
    }
}
